package com.sws.device.service.impl;

import com.sws.device.domain.DevDeviceDTO;
import com.sws.device.mapper.DevDeviceWebSocketMapper;
import com.sws.device.service.DevDeviceWebSocketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Calendar;
import java.util.Date;

/**
 * 设备信息服务实现类
 */
@Service
public class DevDeviceWebSocketServiceImpl implements DevDeviceWebSocketService {
    
    @Autowired
    private DevDeviceWebSocketMapper deviceMapper;
    
    @Override
    public DevDeviceDTO getDeviceBySn(String sn) {
        return deviceMapper.selectBySn(sn);
    }
    
    @Override
    public boolean saveOrUpdateDevice(DevDeviceDTO device) {
        if (device.getId() == null) {
            // 新增
            return deviceMapper.insert(device) > 0;
        } else {
            // 更新
            return deviceMapper.update(device) > 0;
        }
    }
    
    @Override
    public DevDeviceDTO handleDeviceConnect(String sn, String ip, Integer ts, String token, Integer expire, Integer interval) {
        // 查询设备是否存在
        DevDeviceDTO device = getDeviceBySn(sn);
        
        // 将时间戳转换为北京时间
        Date eventTime = convertTimestampToBeijingTime(ts);
        
        // 计算Token过期时间
        Date tokenExpireTime = calculateTokenExpireTime(expire);
        
        if (device == null) {
            // 设备不存在，创建新设备
            device = new DevDeviceDTO();
            device.setSn(sn);
            device.setIp(ip != null ? ip : "未设置ip地址");
            device.setLocation("设备未指定部署位置");
            device.setToken(token);
            device.setTokenExpireTime(tokenExpireTime);
            device.setHeartbeatInterval(interval);
            device.setTs(ts);
            device.setEventTime(eventTime);
            device.setDevStatus(0); // 默认正常状态
            device.setCreateBy("设备自连");
            device.setCreateTime(new Date());
            device.setUpdateBy("设备自连");
            device.setUpdateTime(new Date());
            device.setDelFlag("0");
            
            // 保存设备信息
            deviceMapper.insert(device);
        } else {
            // 设备存在，更新相关信息
            device.setToken(token);
            device.setTokenExpireTime(tokenExpireTime);
            device.setHeartbeatInterval(interval);
            device.setTs(ts);
            device.setEventTime(eventTime);
            device.setUpdateBy("设备自更");
            device.setUpdateTime(new Date());
            
            // 更新设备信息
            deviceMapper.update(device);
        }
        
        return device;
    }
    
    @Override
    public DevDeviceDTO updateDeviceToken(String sn, String token, Integer expire) {
        // 查询设备是否存在
        DevDeviceDTO device = getDeviceBySn(sn);
        if (device != null) {
            // 设备存在，更新Token信息
            device.setToken(token);
            device.setTokenExpireTime(calculateTokenExpireTime(expire));
            device.setUpdateBy("设备自更");
            device.setUpdateTime(new Date());
            
            // 更新当前时间戳
            long currentTimestamp = System.currentTimeMillis() / 1000;
            device.setTs((int) currentTimestamp);
            device.setEventTime(new Date());
            
            // 更新设备信息
            deviceMapper.update(device);
        }
        return device;
    }
    
    @Override
    public DevDeviceDTO updateDeviceHeartbeat(String sn, String ip) {
        // 查询设备是否存在
        DevDeviceDTO device = getDeviceBySn(sn);
        if (device != null) {
            // 设备存在，更新IP地址
            if (ip != null) {
                device.setIp(ip);
            }
            device.setUpdateBy("设备自更");
            device.setUpdateTime(new Date());
            
            // 更新当前时间戳
            long currentTimestamp = System.currentTimeMillis() / 1000;
            device.setTs((int) currentTimestamp);
            device.setEventTime(new Date());
            
            // 更新设备信息
            deviceMapper.update(device);
        }
        return device;
    }
    
    /**
     * 将UNIX时间戳转换为北京时间
     *
     * @param timestamp UNIX时间戳，单位：秒
     * @return 北京时间
     */
    private Date convertTimestampToBeijingTime(Integer timestamp) {
        if (timestamp == null) {
            return null;
        }
        
        // 将秒转换为毫秒
        long milliseconds = timestamp.longValue() * 1000L;
        
        // 创建Date对象
        Date date = new Date(milliseconds);
        
        // 返回北京时间
        return date;
    }
    
    /**
     * 计算Token过期时间
     *
     * @param expireSeconds 过期秒数
     * @return Token过期时间
     */
    private Date calculateTokenExpireTime(Integer expireSeconds) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.SECOND, expireSeconds);
        return calendar.getTime();
    }
    
    /**
     * 计算Token剩余有效时间（秒）
     *
     * @param tokenExpireTime Token过期时间
     * @return 剩余有效时间（秒）
     */
    public int calculateTokenRemainingTime(Date tokenExpireTime) {
        if (tokenExpireTime == null) {
            return 0;
        }
        
        long currentTimeMillis = System.currentTimeMillis();
        long expireTimeMillis = tokenExpireTime.getTime();
        long remainingMillis = expireTimeMillis - currentTimeMillis;
        
        // 转换为秒并确保不小于0
        return (int) Math.max(0, remainingMillis / 1000);
    }
} 